package com.ld.poetry.controller;


import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.ld.poetry.aop.LoginCheck;
import com.ld.poetry.config.PoetryResult;
import com.ld.poetry.entity.SysConfig;
import com.ld.poetry.enums.PoetryEnum;
import com.ld.poetry.service.SysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 参数配置表 前端控制器
 * </p>
 *
 * @author sara
 * @since 2024-03-23
 */
@RestController
@RequestMapping("/sysConfig")
public class SysConfigController {

    @Autowired
    private SysConfigService sysConfigService;

    /**
     * 查询系统参数
     * 
     * 功能说明：
     * 1. 获取所有公开的系统配置参数
     * 2. 将配置参数转换为键值对形式
     * 3. 返回配置参数映射
     * 
     * 请求参数：
     * - 无
     * 
     * 返回结果：
     * - 成功：返回配置参数映射，key为配置键名，value为配置值
     * - 失败：返回错误信息
     * 
     * 处理流程：
     * 1. 创建查询条件
     * 2. 设置配置类型为公开
     * 3. 查询配置列表
     * 4. 转换为键值对映射
     * 5. 返回结果
     * 
     * 注意事项：
     * 1. 只返回公开类型的配置
     * 2. 配置键名作为Map的key
     * 3. 配置值作为Map的value
     * 4. 无需登录即可访问
     * 
     * @return PoetryResult<Map<String, String>> 配置参数映射
     */
    @GetMapping("/listSysConfig")
    public PoetryResult<Map<String, String>> listSysConfig() {
        // 创建查询条件
        LambdaQueryChainWrapper<SysConfig> wrapper = new LambdaQueryChainWrapper<>(sysConfigService.getBaseMapper());
        
        // 设置配置类型为公开，查询配置列表
        List<SysConfig> sysConfigs = wrapper.eq(SysConfig::getConfigType, Integer.toString(PoetryEnum.SYS_CONFIG_PUBLIC.getCode()))
                .list();
        
        // 将配置列表转换为键值对映射
        Map<String, String> collect = sysConfigs.stream().collect(Collectors.toMap(SysConfig::getConfigKey, SysConfig::getConfigValue));
        
        // 返回结果
        return PoetryResult.success(collect);
    }

    /**
     * 保存或更新系统配置
     * 
     * 功能说明：
     * 1. 支持新增和更新系统配置信息
     * 2. 对配置信息进行完整性校验
     * 3. 对配置类型进行合法性校验
     * 
     * 请求参数：
     * @param sysConfig 系统配置实体
     * - id: 配置ID（更新时必填）
     * - configName: 配置名称（必填）
     * - configKey: 配置键名（必填）
     * - configValue: 配置键值（选填）
     * - configType: 配置类型（必填，1：私用，2：公开）
     * 
     * 返回结果：
     * @return PoetryResult 操作结果
     * - 成功：返回成功信息
     * - 失败：返回错误信息
     * 
     * 处理流程：
     * 1. 校验必填参数
     * 2. 校验配置类型
     * 3. 保存或更新配置
     * 
     * 注意事项：
     * 1. 需要管理员权限（@LoginCheck(0)）
     * 2. 配置名称、键名和类型不能为空
     * 3. 配置类型只能是1或2
     * 4. 更新时必须提供正确的配置ID
     */
    @PostMapping("/saveOrUpdateConfig")
    @LoginCheck(0)
    public PoetryResult saveConfig(@RequestBody SysConfig sysConfig) {
        // 校验必填参数
        if (!StringUtils.hasText(sysConfig.getConfigName()) ||
                !StringUtils.hasText(sysConfig.getConfigKey()) ||
                !StringUtils.hasText(sysConfig.getConfigType())) {
            return PoetryResult.fail("请完善所有配置信息！");
        }
        
        // 校验配置类型
        String configType = sysConfig.getConfigType();
        if (!Integer.toString(PoetryEnum.SYS_CONFIG_PUBLIC.getCode()).equals(configType) &&
                !Integer.toString(PoetryEnum.SYS_CONFIG_PRIVATE.getCode()).equals(configType)) {
            return PoetryResult.fail("配置类型不正确！");
        }
        
        // 保存或更新配置
        sysConfigService.saveOrUpdate(sysConfig);
        return PoetryResult.success();
    }

    /**
     * 删除系统配置
     * 
     * 功能说明：
     * 1. 根据配置ID删除指定的系统配置
     * 2. 需要管理员权限
     * 3. 支持单个配置删除
     * 
     * 请求参数：
     * @param id 配置ID（必填）
     * - 类型：Integer
     * - 说明：要删除的配置的唯一标识符
     * 
     * 返回结果：
     * @return PoetryResult 操作结果
     * - 成功：返回成功信息
     * - 失败：返回错误信息
     * 
     * 处理流程：
     * 1. 接收配置ID参数
     * 2. 调用服务层删除配置
     * 3. 返回操作结果
     * 
     * 注意事项：
     * 1. 需要管理员权限（@LoginCheck(0)）
     * 2. 配置ID不能为空
     * 3. 删除操作不可恢复
     * 4. 删除前需要确认配置是否被其他功能依赖
     */
    @GetMapping("/deleteConfig")
    @LoginCheck(0)
    public PoetryResult deleteConfig(@RequestParam("id") Integer id) {
        sysConfigService.removeById(id);
        return PoetryResult.success();
    }

    /**
     * 查询所有配置
     * 
     * 功能说明：
     * 1. 获取所有系统配置参数（包括公开和私用）
     * 2. 返回完整的配置列表
     * 3. 需要管理员权限
     * 
     * 请求参数：
     * - 无
     * 
     * 返回结果：
     * - 成功：返回配置列表，包含所有配置信息
     * - 失败：返回错误信息
     * 
     * 处理流程：
     * 1. 创建查询条件
     * 2. 查询所有配置
     * 3. 返回结果
     * 
     * 注意事项：
     * 1. 需要管理员权限（@LoginCheck(0)）
     * 2. 返回所有类型的配置
     * 3. 包含敏感信息
     * 4. 需要谨慎使用
     * 
     * @return PoetryResult<List<SysConfig>> 配置列表
     */
    @GetMapping("/listConfig")
    @LoginCheck(0)
    public PoetryResult<List<SysConfig>> listConfig() {
        // 创建查询条件
        LambdaQueryChainWrapper<SysConfig> wrapper = new LambdaQueryChainWrapper<>(sysConfigService.getBaseMapper());
        
        // 查询所有配置
        List<SysConfig> configs = wrapper.list();
        
        // 返回结果
        return PoetryResult.success(configs);
    }
}
